Let’s skim through this blog post to understand hierarchical structure of Australian Statistical Geography Standard (ASGS) 3th Edition.
SA2-level population data is commonly used in urban planning to determine warehouse locations. However, fulfillment centers operate at the last-mile stage of the logistics chain, delivering directly to households and retail stores. Therefore, using finer-scale population data — at the SA1 or Mesh Block level — is more appropriate to determine their locations.
The yellow population dots in my report were built on SA1 level.
Inspiration
My inspiration comes from the map1 featured in Population and Housing in Regional Victoria 2020 Report. As far as I know, the original was created using ArcGIS - not open-source.
With some familiarity in R, dplyr, and sf packages — you can recreate similar dot-density plots at different statistical geography levels and resolutions, completely free of charge.
Execution
Resources (to work with spatial vector data in R)
You need R, RStudio, and some packages to get started. If you are completely new, I recommend resources from RLadies Sydney (BasicBasics and CleanItUp units are must-read).
In R, Working with tabular data using dplyr package is straightforward, |>or%>% pipe operators and these functions: mutate, select, filter and group_by along with 4 types of join should get you far.
The most popular package to work with spatial data in R is sf. An sf object extends regular tabular data frames to include a geometry column, which contains the spatial information. Thus, a simple explanation on how to read shapefiles with sf should be enough to get you started. Then, those mentioned dplyr functions will come in handy.
1. Preparing data
This stage involves:
Retrieving population data from the Australian Bureau of Statistics (ABS): ABS provides population counts at the smallest level - Mesh Block, along with allocation file for mapping among levels, and shapefiles for each level. By joining these files2, a shapefile with population counts of any level can be created.
Choosing a resolution for the population dots (e.g., 1 dot = 100 people)
SA1_count_shapefile includes population counts Person, and polygon Geometry for each SA1 block (see below).
2
n_dots is the number of population dots to generate per SA1 polygon, calculated as floor(Person / 100). This resolution (1 dot = 100 people) is chosen because most SA1s have between 200 and 800 people, resulting in 2 to 8 dots per block. Using floor() ensures we only generate whole dots and prevents overcounting.
3
Optionally, to reduce computation time, filter(n_dots > 0) is to skip blocks with zero population.
Output of this stage should be an sf object with polygons and number of dots for each polygon.